package ai.zixing.mashibing.advance_class.secend.class01;

/**
 * zigzag打印矩阵
 */
public class Code06_ZigZagPrintMatrix {

    public static void main(String[] args) {
        int[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
        // 1 2 5 9 6 3 4 7 10 11 8 12
        printMatrixZigZag(matrix);
    }
    private static void printMatrixZigZag(int[][] matrix) {
        // A 坐标
        int aR = 0;
        int aC = 0;
        // B 坐标
        int bR = 0;
        int bC = 0;
        // 结束坐标
        int endR = matrix.length - 1;
        int endC = matrix[0].length - 1;
        // 是不是从右上向坐下打印
        boolean fromUp = false;
        // 终止条件是 A 到达 最右侧
        while (aR != endR + 1) {
            // 打印
            printLevel(matrix, aR, aC, bR, bC, fromUp);

            // 以下四行顺序不能变化，先变的先前面

            // A 坐标变化【先往右，到边界，然后往下】
            // A 的列数没有到最后一列，行号位置不变
            aR = aC == endC ? aR + 1 : aR; // A 行变化
            // A 的列数到了最后一列，行号 + 1
            aC = aC == endC ? aC : aC + 1; // A 列变化
            // B 坐标变化 【先往下，下不去，往右走】
            // ***************
            bC = bR == endR ? bC + 1 : bC; // B 列变化
            bR = bR == endR ? bR : bR + 1; // B 行变化
            // 打印方向取反
            fromUp = !fromUp;
        }
        System.out.println();
    }

    private static void printLevel(int[][] matrix, int aR, int aC, int bR, int bC, boolean fromUp) {
        if (fromUp) {
            while (aR != bR + 1) {
                System.out.print(matrix[aR++][aC--] + " ");
            }
        } else {
            while (bR != aR - 1) {
                System.out.print(matrix[bR--][bC++] + " ");
            }
        }
    }
}
